/**
 * 滑动窗口
 * @Author：徐志荣
 * @Date：2023/9/4 上午 10:23
 */
public class Day0904 {
    public static void main(String[] args) {
        int[] nums = {2,3,1,2,4,3};
        System.out.println("209. 长度最小的子数组" + minSubArrayLen(7,nums));
        String s = "abcabcbb";
        System.out.println("3. 无重复字符的最长子串  " + lengthOfLongestSubstring(s));
    }

    public static int minSubArrayLen(int target, int[] nums) {
        //需要一个sum，还需要一个len变量来记录 最小的长度值
        int sum = 0,len = Integer.MAX_VALUE;
        //right 一遍
        for(int left = 0,right = 0;right<nums.length;right++){
            sum += nums[right];
            //只有 sum 大于 目标值的时候：
            while(sum >= target){
                //记录并且比较最小的长度值
                len = Math.min(len,right-left+1);
                //调整窗口范围
                sum -= nums[left];
                //出窗口
                left++;
            }
        }
        return len == Integer.MAX_VALUE ? 0:len;
    }
    public static int lengthOfLongestSubstring(String s) {
        char[] ch = s.toCharArray();
        //用数组模拟哈希表
        int[] hash = new int[128];
        int ret = 0;
        for(int left = 0,right = 0;right<s.length();right++){
            //入窗口,将：hash表中 ch数组中的right下标值 加1
            // 为了去标记 该 字符 的唯一性，如果超出了 1 ，就说明 有重复的值出现了
            hash[ch[right]]++;
            //如果是 大于1 ，说明重复了~~
            while(hash[ch[right]]>1){
                // 需要将左边的 ch数组中的left下标值 减1 ，将该字符移除 hash表
                hash[ch[left++]]--;
            }
            //更新结果
            ret = Math.max(ret,right-left+1);
        }
        return ret;
    }
}
